// new步骤
// 1. 新建空对象
// 2. 设置原型
//    设置新建对象的原型为构造函数的prototype属性
// 3. 修改this指向
//    让this指向这个对象，执行构造函数的代码（为这个新对象添加属性）
// 4. 返回

function myNew() {
    // 1. 新建对象
    let newObj = {};
    // 这里获取到的constructor就是Person
    let constructor = Array.prototype.shift.call(arguments);
    let res = null;
    
    // 判断参数是否是一个函数
    if (typeof constructor !== 'function') {
        console.log('type error');
        return;
    };

    // 2. 新建对象
    newObj = Object.create(constructor.prototype);
    // 3. 修改this指向
    res = constructor.apply(newObj, arguments);
    // 3. 判断返回对象
    let flag = res && (typeof res === 'object' || typeof res === 'function');
    return flag ? res : newObj;
};


function Person(name, age) {
    this.name = name;
    this.age = age;
};

const p1 = myNew(Person, 'Jack', 18);

console.log(p1);